/**
 * @file dal_led.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2025-01-08
 *
 * @copyright Copyright (c) 2025
 *
 */

/* includes ----------------------------------------------------------*/
#include "dal_led.h"
#include "hdl_auto_init.h"
/* typedef -----------------------------------------------------------*/
/* define ------------------------------------------------------------*/
/* variables ---------------------------------------------------------*/
struct led_device prvled_device = {
    vhdl_led_init,
    vhdl_led_on,
    vhdl_led_off,
};

/**
 * @brief 引脚初始化参数列表
 *
 */
cfg_led_pin_t pin_init[] = {

#if defined(COMM_LED)
    {RCC_AHB1Periph_GPIOC, GPIOC, GPIO_Pin_10, GPIO_Mode_OUT, RCC_AHB1PeriphClockCmd},
#endif

#if defined(WARN_LED)
    {RCC_AHB1Periph_GPIOC, GPIOC, GPIO_Pin_11, GPIO_Mode_OUT, RCC_AHB1PeriphClockCmd},
#endif

#if defined(TASK_LED)
    {RCC_AHB1Periph_GPIOC, GPIOC, GPIO_Pin_12, GPIO_Mode_OUT, RCC_AHB1PeriphClockCmd},
#endif
};
/* function prototypes -----------------------------------------------*/

/**********************************************************************/
/*            Static Function Call Interfaces                         */
/**********************************************************************/
/**
 * @brief 计算led初始化结构体列表的长度
 *
 * @return uint8_t
 */
static uint8_t prvdal_calculation_led_init_len(void)
{
    return (sizeof(pin_init) / sizeof(cfg_led_pin_t));
}

/**
 * @brief 检查边界值范围
 *
 * @param number
 * @return true
 * @return false
 */
static bool pruxdal_led_is_out_of_bounds(int number)
{
    return ((number > LED_MAX_NUM) || (number < 0));
}

/**********************************************************************/
/*            External Function Call Interfaces                       */
/**********************************************************************/

/*******************************************************************************
 * @FunctionName: vdal_led_init
 * @Author:       陈工
 * @DateTime:     2023年5月19日T14:58:19+0800
 * @Purpose:
 * @param:        void
 *******************************************************************************/
void vdal_led_init(void)
{
    prvled_device.init(pin_init, prvdal_calculation_led_init_len());
}

/**
 * @brief 打开单个led
 *
 * @param port	端口号
 * @param pin	引脚号
 */
void vdal_led_on(GPIO_TypeDef* port, uint16_t pin)
{
    prvled_device.led_on(port, pin);
}

/**
 * @brief 关闭单个led
 *
 * @param port	端口号
 * @param pin	引脚号
 */
void vdal_led_off(GPIO_TypeDef* port, uint16_t pin)
{
    prvled_device.led_off(port, pin);
}

/**
 * @brief led控制
 *
 * @param num led编号
 * @param state led开/关状态
 */
void vdal_led_ctrl(uint8_t num, FunctionalState state)
{

    // 边界范围，防止结构体数组溢出，导致程序出错
    if (pruxdal_led_is_out_of_bounds(num)) {
        return;
    }

    if (ENABLE == state) {
        /* 打开led */
        vdal_led_on(pin_init[num].pin_port, pin_init[num].pin_num);
    }
    else {
        /* 关闭led */
        vdal_led_off(pin_init[num].pin_port, pin_init[num].pin_num);
    }
}

#ifdef HDL_USING_AUTO_INIT
// 自动初始化
INIT_BOARD_EXPORT(vdal_led_init);
#endif
